home *** CD-ROM | disk | FTP | other *** search
- ;Programm: BangerMenuDisk bietet eine grafische Oberfläche zum Anwählen von Programmen
- ; die beim Starten in der Startup-Sequence aufgerufen werden sollen.
- ;Autor : Andre´ Trettin
- ;Codename: Banger
- ;Begin : 31-Mai-95 17:08:28
- ;$VER : BangerMenuDisk.Asm 1.4 (13-Feb-96)
-
- ** INCLUDE Struktur Variablen
- * Fehler Codes: 21=kein Speicher
- * 22=konnte Library (oder Libraries) nicht öffnen
- * 23=GetVisualInfo Fehler
- * 24=konnte File S:Banger.Prefs nicht öffnen
- * 25=bei der Gadgeterschaffung trat ein Fehler auf
- * 26=konnte Fenster nicht öffnen oder Task nicht Finden
- * 27=Einstellungen sind Leer
- * 28=kein Speicher für die Einstellungen
- * 29=kein MsgPort
- * 30=konnte kein IORequest create
- * 31=konnte Device nicht öffnen
- * 32=falsche Parameter angabe
- * 10=Return Code für die Startup-Sequence
-
- incdir INCLUDE:
- include exec/exec.i
- include exec/io.i
- include devices/input.i
- include devices/inputevent.i
- include dos/dos.i
- include dos/dosextens.i
- include intuition/intuition.i
- include libraries/gadtools.i
- include lvo/exec_lib.i
- include lvo/dos_lib.i
- include lvo/intuition_lib.i
- include lvo/gadtools_lib.i
- include lvo/input_lib.i
-
- STRUCTURE Internal,0
- APTR INTUIBase
- APTR DOSBase
- APTR GADBase
- APTR WindowHandle
- APTR OutputHandle
- APTR ScreenHandle
- APTR VisualInfo
- APTR PrefsFileHandle
- APTR FileSpeicher
- APTR FontAddr
- APTR GadgetListe
- APTR meinTask
- APTR alterTask
- APTR AnGad
- APTR MsgPortAddr
- APTR RDArgs
- STRUCT FIB,[fib_SIZEOF]
- STRUCT GadgetAddr,[68*4]
- STRUCT TastenIBlock,[IO_SIZE]
- LONG Filegroesse
- LONG NOKEYArray
- WORD BreiteGPos
- WORD BreiteGADs
- WORD BreiteWin
- WORD CAPS
- BYTE AnzahlGADs
- BYTE RelativeTopC
- BYTE RelativeLeftC
- LABEL Int_SIZEOF
- ;;
- ** Hauptprog
- moveq #0,d7
- move.l 4.w,a6
- move.l #Int_SIZEOF,d0
- move.l #MEMF_PUBLIC!MEMF_CLEAR,d1
- jsr _LVOAllocMem(a6)
- move.l d0,a5
- bne.s LibraryO
- moveq #21,d7 ;21 = kein Speicher
- bra.s Ende
- LibraryO
- bsr.w InitRelative
- bsr.w LibOeffne
- tst.w d7
- bne.s SchliesseLibrary
- bsr.s Parameter
- tst.w d7
- bne.s SchliesseLibrary
- bsr.w WaitOnCaps
- cmp.w #10,d7
- bhi.s SchliesseLibrary
- tst.w d7
- beq.s Menuerscheine
- moveq #0,d7
- bra.s SchliesseLibrary
- Menuerscheine
- bsr.w PubScreenOeffne
- tst.w d7
- bne.s SchliesseLibrary
- bsr.w LadePrefs
- tst.w d7
- bne.s SchliesseScreen
- bsr.w InitGadget
- tst.w d7
- bne.s FreiSPrefs
- bsr.w FensterOeffne
- tst.w d7
- bne.s RemGad
- bsr.w GadAktivieren
- bsr.w RefreshWin
- bsr.w MessageAbFragen
- bsr.w FensterSchliesse
- RemGad
- bsr.w RemoveGadget
- FreiSPrefs
- bsr.w SpeicherPrefs
- SchliesseScreen
- bsr.w ScreenSchliesse
- SchliesseLibrary
- bsr.w LibSchliesse
- move.l a5,a1
- move.l #Int_SIZEOF,d0
- jsr _LVOFreeMem(a6)
- Ende
- move.l d7,d0
- ende
- rts
- ;;
- ** Parameter
- Parameter
- move.l DOSBase(a5),a6
- lea ParaTemplate(pc),a1
- move.l a1,d1
- lea NOKEYArray(a5),a1
- move.l a1,d2
- moveq #0,d3
- jsr _LVOReadArgs(a6)
- move.l d0,RDArgs(a5)
- bne.s ParaOK
- jsr _LVOIoErr(a6)
- move.l d0,d1
- moveq #0,d2
- jsr _LVOPrintFault(a6)
- moveq #32,d7
- rts
- ParaOK
- move.l RDArgs(a5),d1
- jsr _LVOFreeArgs(a6)
- rts
- ;;
- ** Warte auf Caps Lock
- WaitOnCaps
- tst.l NOKEYArray(a5)
- bne.s NOKeyJA
- move.l 4.w,a6
- jsr _LVOCreateMsgPort(a6)
- move.l d0,MsgPortAddr(a5)
- bne.s MsgPortOK
- moveq #29,d7 ;29 = kein MsgPort
- addq #4,a7
- pea SchliesseLibrary(pc)
- rts
- MsgPortOK
- move.l d0,a0
- move.l #IOSTD_SIZE,d0
- jsr _LVOCreateIORequest(a6)
- move.l d0,TastenIBlock(a5)
- bne.s OeffneDev
- moveq #30,d7 ;30=konnte kein IORequest create
- bra.s FreiMsgP
- OeffneDev
- lea inputname(pc),a0
- move.l d0,a1
- moveq #0,d0
- move.l #IOF_QUICK,d1
- jsr _LVOOpenDevice(a6)
- tst.l d0
- beq.s DevOK
- moveq #31,d7 ;31=konnte Device nicht öffnen
- bra.s IOReqDel
- DevOK
- move.l TastenIBlock(a5),a0
- move.l IO_DEVICE(a0),a6
- jsr _LVOPeekQualifier(a6)
- and.w #IEQUALIFIER_CAPSLOCK,d0
- cmp.w #IEQUALIFIER_CAPSLOCK,d0
- beq.s CAPSgedrueckt
- moveq #10,d7
- CAPSgedrueckt
- move.l 4.w,a6
- lea TastenIBlock(a5),a1
- jsr _LVOCloseDevice(a6)
- IOReqDel
- move.l TastenIBlock(a5),a0
- jsr _LVODeleteIORequest(a6)
- FreiMsgP
- move.l MsgPortAddr(a5),a0
- jsr _LVODeleteMsgPort(a6)
- NOKeyJA
- rts
- ;;
- ** GadAktivieren
- GadAktivieren
- move.l GadgetAddr(a5),a4
- moveq #1,d6
- bsr.w SelGK
- lea GadgetAddr(a5),a4
- move.l a4,AnGad(a5)
- rts
- ;;
- ** Relative Init
- InitRelative
- lea topazFName8(pc),a0
- lea topaz8(pc),a1
- move.l a0,(a1)
- move.l a1,FontAddr(a5)
- rts
- ;;
- ** Message Auswertung
- MessageAbFragen
- move.l WindowHandle(a5),a0
- move.l wd_UserPort(a0),a0
- move.l 4.w,a6
- jsr _LVOWaitPort(a6)
- nocheine
- move.l GADBase(a5),a6
- move.l WindowHandle(a5),a0
- move.l wd_UserPort(a0),a0
- jsr _LVOGT_GetIMsg(a6)
- move.l d0,a1
- tst.l d0
- beq.s MessageAbFragen
- move.l im_Class(a1),d4
- move.w im_Code(a1),d5
- move.l im_IAddress(a1),a4
- jsr _LVOGT_ReplyIMsg(a6)
- cmpi.l #IDCMP_CLOSEWINDOW,d4
- beq.w ende
- cmpi.l #IDCMP_REFRESHWINDOW,d4
- beq.s RefreWin
- cmpi.l #IDCMP_GADGETUP,d4
- beq.w GadAuswertung
- cmpi.l #IDCMP_VANILLAKEY,d4
- beq.w VTastendruck
- cmpi.l #IDCMP_RAWKEY,d4
- beq.w RTastendruck
- bra.s nocheine
- RefreWin
- bsr.w RefreshWin
- bra.s nocheine
- UpTaste
- move.l AnGad(a5),a4
- lea GadgetAddr(a5),a3
- cmp.l a3,a4
- beq.s DownTEnde
- lea -4(a4),a3
- bra.s GadAnwaehlen
- DownTaste
- move.l AnGad(a5),a4
- lea 4(a4),a3
- cmp.l #0,(a3)
- beq.s DownTEnde
- GadAnwaehlen
- move.l (a4),a4
- moveq #0,d6
- bsr.w SelGK
- moveq #1,d6
- move.l (a3),a4
- bsr.w SelGK
- move.l (a3),a3
- bsr.w GetGAddr
- DownTEnde
- bra.w nocheine
- rechteBank
- bsr.s NummerGad
- add.w #17,d0
- cmp.b AnzahlGADs(a5),d0
- bls.s rechtsOK
- sub.b AnzahlGADs(a5),d0
- neg.w d0
- add.w #17,d0
- bra.s rechtsweiter
- rechtsOK
- moveq #17,d0
- rechtsweiter
- asl.w #2,d0
- lea (a4,d0.w),a3
- bra.s GadAnwaehlen
- NummerGad
- move.l AnGad(a5),a4
- move.l (a4),a3
- move.w gg_GadgetID(a3),d0
- rts
- linkeBank
- bsr.s NummerGad
- sub.w #18,d0
- tst.w d0
- bgt.s linksOk
- moveq #0,d0
- linksOk
- asl.w #2,d0
- lea GadgetAddr(a5),a3
- lea (a3,d0.w),a3
- bra.s GadAnwaehlen
- RTastendruck
- cmp.b #$4e,d5 ;rechts
- beq.b rechteBank
- cmp.b #$4f,d5 ;links
- beq.s linkeBank
- cmp.b #$4d,d5 ;Down
- beq.w DownTaste
- cmp.b #$4c,d5 ;Up
- beq.w UpTaste
- bra.w nocheine
- VTastendruck
- cmp.b #$0d,d5
- beq.s Auswahl
- cmp.b #$1b,d5
- beq.w ende
- bclr #5,d5
- cmp.b #'Q',d5
- beq.w ende
- bra.w nocheine
- GetGAddr
- lea GadgetAddr(a5),a4
- FindeGAdd
- cmp.l (a4)+,a3
- beq.s RichtGAdd
- bra.s FindeGAdd
- RichtGAdd
- lea -4(a4),a4
- move.l a4,AnGad(a5)
- rts
- SelGK
- move.l WindowHandle(a5),a0
- bsr.b RemoveGSuche
- tst.l d6
- beq.s DisSel
- or.w #GFLG_SELECTED,gg_Flags(a4)
- bra.s NunSel
- DisSel
- eor.w #GFLG_SELECTED,gg_Flags(a4)
- NunSel
- move.l WindowHandle(a5),a0
- bsr.b AddGSuche
- rts
- RemoveGSuche
- move.l a4,a1
- move.l INTUIBase(a5),a6
- jsr _LVORemoveGadget(a6)
- rts
- AddGSuche
- move.l WindowHandle(a5),a0
- move.l a4,a1
- moveq #-1,d0
- jsr _LVOAddGadget(a6)
- move.l a4,a0
- move.l WindowHandle(a5),a1
- suba.l a2,a2
- jsr _LVORefreshGadgets(a6)
- rts
- Auswahl
- move.l AnGad(a5),a4
- move.l (a4),a4
- GadAuswertung
- move.w gg_GadgetID(a4),d6
- asl.b #1,d6
- subq #2,d6
- move.l FileSpeicher(a5),a1
- SucheExloop
- cmp.b #0,(a1)+
- bne.s SucheExloop
- dbra d6,SucheExloop
- move.l a1,d1
- moveq #0,d2
- moveq #0,d3
- move.l DOSBase(a5),a6
- jsr _LVOExecute(a6)
- moveq #10,d7
- rts
- ;;
- ** Refresh Fenster
- RefreshWin
- move.l GADBase(a5),a6
- move.l WindowHandle(a5),a0
- suba.l a1,a1
- jsr _LVOGT_RefreshWindow(a6)
- move.l WindowHandle(a5),a0
- jsr _LVOGT_BeginRefresh(a6)
- move.l WindowHandle(a5),a0
- moveq #DOSTRUE,d0
- jsr _LVOGT_EndRefresh(a6)
- rts
- ;;
- ** Fenster Öffnen
- FensterOeffne
- move.l INTUIBase(a5),a6
- lea Fenster_Tags(pc),a1
- move.l GadgetListe(a5),12(a1)
- lea WindowTitle(pc),a0
- move.l a0,4(a1)
- lea ScreenTitle(pc),a0
- move.l a0,20(a1)
- move.w BreiteGPos(a5),d0
- add.w #40,d0
- move.w d0,30(a1)
- sub.w #640,d0
- neg.w d0
- asr.w #1,d0
- move.w d0,54(a1)
- move.w BreiteWin(a5),d4
- bne.s BreiteresWin
- move.b AnzahlGADs(a5),d4
- BreiteresWin
- move.w d4,d6
- move.w d6,d5
- add.w d6,d5
- asl.w #3,d4
- add.w d5,d4
- add.w #36,d4
- move.w d4,38(a1)
- move.w #252,d0
- sub.w d4,d0
- asr.w #1,d0
- move.w d0,46(a1)
- suba.l a0,a0
- jsr _LVOOpenWindowTagList(a6)
- move.l d0,WindowHandle(a5)
- beq.b ErrorWindow
- move.l 4.w,a6
- suba.l a1,a1
- jsr _LVOFindTask(a6)
- move.l d0,meinTask(a5)
- beq.s ErrorTask
- move.l d0,a0
- move.l pr_WindowPtr(a0),alterTask(a5)
- move.l WindowHandle(a5),pr_WindowPtr(a0)
- rts
- ErrorTask
- bsr.s keinTask
- ErrorWindow
- moveq #26,d7 ;26 = konnte Fenster nicht öffnen oder Task nicht finden
- rts
- FensterSchliesse
- move.l meinTask(a5),a0
- move.l alterTask(a5),pr_WindowPtr(a0)
- keinTask
- move.l INTUIBase(a5),a6
- move.l WindowHandle(a5),a0
- jsr _LVOCloseWindow(a6)
- rts
- ;;
- ** Init Gadgets
- InitGadget
- move.l ScreenHandle(a5),a0
- move.l sc_Font(a0),a1
- move.w ta_YSize(a1),d2
- add.b sc_WBorTop(a0),d2
- addq #1,d2
- move.b d2,RelativeTopC(a5)
- move.b sc_WBorTop(a0),RelativeLeftC(a5)
- move.l FileSpeicher(a5),a1
- move.l Filegroesse(a5),d0
- move.l a1,a2
- add.l d0,a2
- moveq #0,d0
- moveq #0,d1
- moveq #0,d2
- moveq #0,d3
- Suchenloop
- addq #1,d1 ;länge GadgetName aus der Prefs
- move.b (a1)+,d4 ;Prefs daten nach d4
- einReturn
- cmp.b #10,d4 ;schon ein Return ?
- bne.s keinReturn
- move.b #0,-1(a1) ;das Return mit NullByte abschliessen
- tst.b d3 ;d3 0/1 entweder Gadgetname oder Programm bzw. Batchdatei
- beq.s BreiteZaehlen
- moveq #0,d3
- bra.s wortkleiner
- BreiteZaehlen
- moveq #1,d3
- addq #1,d0 ;d0=Anzahl der Gadgets
- cmp.b d2,d1 ;d2 enthält den längsten Gadgetnamen
- bls.s wortkleiner
- move.b d1,d2 ;neue länge war größer als alte
- wortkleiner
- moveq #0,d1
- keinReturn
- cmp.l a1,a2 ;a2=a1 dann PrefsEnde
- bne.s Suchenloop
- PrefsEnde
- tst.b d0
- beq.w PrefsNull
- move.b d0,AnzahlGADs(a5)
- asl.w #3,d2
- add.w #10,d2
- move.w d2,BreiteGADs(a5)
- lea GadgetListe(a5),a0
- move.l GADBase(a5),a6
- jsr _LVOCreateContext(a6)
- move.l d0,a0
- beq.w ErrorGadget
- lea UniGad(pc),a1
- move.b RelativeTopC(a5),d2
- move.b RelativeLeftC(a5),d3
- add.b d2,gng_TopEdge+1(a1)
- add.b d3,gng_LeftEdge+1(a1)
- move.w BreiteGADs(a5),gng_Width(a1)
- move.l VisualInfo(a5),gng_VisualInfo(a1)
- move.l FontAddr(a5),gng_TextAttr(a1)
- move.l FileSpeicher(a5),a4
- moveq #0,d6
- move.b AnzahlGADs(a5),d6
- subq #1,d6
- lea GadgetAddr(a5),a3
- move.w #20,BreiteGPos(a5)
- InitGadloop
- moveq #BUTTON_KIND,d0
- lea UniGad(pc),a1
- move.l a4,gng_GadgetText(a1)
- bsr.w Return2Find
- cmp.w #180,gng_TopEdge(a1)
- bge.s GadgetCorritur
- GadgetCoOK
- add.w #10,gng_TopEdge(a1)
- add.w #1,gng_GadgetID(a1)
- suba.l a2,a2
- jsr _LVOCreateGadgetA(a6)
- move.l d0,(a3)+
- beq.s ErrorGadget
- move.l d0,a0
- dbra d6,InitGadloop
- cmp.w #20,BreiteGPos(a5)
- bne.s BreiteDa
- move.w BreiteGADs(a5),BreiteGPos(a5)
- rts
- BreiteDa
- move.w BreiteGADs(a5),d2
- sub.w #20,d2
- add.w d2,BreiteGPos(a5)
- rts
- GadgetVorEnde
- sub.w #40,d2
- move.w d2,BreiteGPos(a5)
- rts
- GadgetCorritur
- clr.w gng_TopEdge(a1)
- move.b RelativeTopC(a5),d2
- add.b d2,gng_TopEdge+1(a1)
- move.w BreiteGADs(a5),d2
- add.w #20,d2
- add.w BreiteGPos(a5),d2
- move.w d2,d5
- add.w BreiteGADs(a5),d5
- cmp.w #630,d5
- bgt.s GadgetVorEnde
- move.w d2,BreiteGPos(a5)
- move.w BreiteGPos(a5),gng_LeftEdge(a1)
- move.w #17,BreiteWin(a5)
- bra.s GadgetCoOK
- ErrorGadget
- bsr.s RemoveGadget
- moveq #25,d7 ;25 = Gadget init Fehler
- rts
- RemoveGadget
- move.l GADBase(a5),a6
- move.l GadgetListe(a5),a0
- jsr _LVOFreeGadgets(a6)
- rts
- Return2Find
- cmp.b #0,(a4)+
- bne.s Return2Find
- Return1Mal
- cmp.b #0,(a4)+
- bne.s Return1Mal
- rts
- PrefsNull
- moveq #27,d7 ;27 = Prefs sind Null
- rts
- ;;
- ** Speicher freigeben von den Einstellungen
- SpeicherPrefs
- move.l FileSpeicher(a5),a1
- move.l Filegroesse(a5),d0
- move.l 4.w,a6
- jsr _LVOFreeMem(a6)
- rts
- ;;
- ** Lade Einstellungen
- LadePrefs
- lea PrefsFile1(pc),a3
- move.l a3,d1
- move.l #MODE_OLDFILE,d2
- move.l DOSBase(a5),a6
- jsr _LVOOpen(a6)
- move.l d0,PrefsFileHandle(a5)
- bne.s OpenPrefsFile
- lea PrefsFileName(pc),a3
- move.l a3,d1
- move.l #MODE_OLDFILE,d2
- jsr _LVOOpen(a6)
- move.l d0,PrefsFileHandle(a5)
- beq.s OpenFileError
- OpenPrefsFile
- move.l d0,d1
- lea FIB(a5),a3
- move.l a3,d2
- jsr _LVOExamineFH(a6)
- move.l fib_Size(a3),Filegroesse(a5)
- move.l Filegroesse(a5),d0
- cmp.l #1,d0
- beq.s nixPrefs
- tst.l d0
- beq.s nixPrefs
- move.l #MEMF_PUBLIC!MEMF_CLEAR,d1
- move.l 4.w,a6
- jsr _LVOAllocMem(a6)
- move.l d0,FileSpeicher(a5)
- beq.s ErrorFiSp
- move.l PrefsFileHandle(a5),d1
- move.l d0,d2
- move.l Filegroesse(a5),d3
- move.l DOSBase(a5),a6
- jsr _LVORead(a6)
- SchliesseFile
- move.l PrefsFileHandle(a5),d1
- jsr _LVOClose(a6)
- rts
- ErrorFiSp
- moveq #28,d7 ;28 = kein Speicher für Prefs
- bra.s SchliesseFile
- OpenFileError
- moveq #24,d7 ;24 = konnte File BangerMenu.prefs nicht öffnen
- rts
- nixPrefs
- moveq #27,d7 ;27 = Prefs vorhanden aber leer
- bra.s SchliesseFile
- ;;
- ** Library Öffnen + Schliessen
- LibOeffne
- move.l a5,a4
- lea intname(pc),a1
- bsr.s OeffneLib
- lea dosname(pc),a1
- bsr.s OeffneLib
- lea gadname(pc),a1
- bsr.s OeffneLib
- rts
- OeffneLib
- moveq #37,d0
- jsr _LVOOpenLibrary(a6)
- move.l d0,(a4)+
- beq.s LibError
- rts
- LibError
- moveq #22,d7 ;22 = konnte Library nicht öffnen
- rts
- LibSchliesse
- move.l 4.w,a6
- moveq #3-1,d2
- lea WindowHandle(a5),a4
- SchliesseLib
- move.l -(a4),a1
- cmp.l #0,a1
- beq.s notOpened
- jsr _LVOCloseLibrary(a6)
- notOpened
- dbra d2,SchliesseLib
- rts
- ;;
- ** PubScreenOeffne
- PubScreenOeffne
- move.l INTUIBase(a5),a6
- suba.l a0,a0
- jsr _LVOLockPubScreen(a6)
- move.l d0,ScreenHandle(a5)
- move.l d0,a0
- suba.l a1,a1
- move.l GADBase(a5),a6
- jsr _LVOGetVisualInfoA(a6)
- move.l d0,VisualInfo(a5)
- beq.s VisualError
- rts
- VisualError
- moveq #23,d7 ;23 = GetVisualInfo Fehler
- bra.s ScrSchliesse
- ScreenSchliesse
- move.l GADBase(a5),a6
- move.l VisualInfo(a5),a0
- jsr _LVOFreeVisualInfo(a6)
- ScrSchliesse
- move.l INTUIBase(a5),a6
- suba.l a0,a0
- move.l ScreenHandle(a5),a1
- jsr _LVOUnlockPubScreen(a6)
- rts
- ;;
- ** LONG Daten
- Fenster_Tags dc.l WA_Title,0
- dc.l WA_Gadgets,0
- dc.l WA_ScreenTitle,0
- dc.l WA_Width,0
- dc.l WA_Height,0
- dc.l WA_Top,11
- dc.l WA_Left,0
- dc.l WA_IDCMP,IDCMP1!IDCMP2
- dc.l WA_Flags,W_Flags1!W_Flags2
- dc.l WA_NewLookMenus,-1
- dc.l WA_AutoAdjust,-1
- dc.l TAG_DONE
- W_Flags1 equ WFLG_ACTIVATE!WFLG_SMART_REFRESH
- W_Flags2 equ WFLG_DRAGBAR!WFLG_DEPTHGADGET!WFLG_CLOSEGADGET
- IDCMP1 equ BUTTONIDCMP!RAWKEY
- IDCMP2 equ IDCMP_CLOSEWINDOW!IDCMP_VANILLAKEY!IDCMP_REFRESHWINDOW
- UniGad
- dc.w 20,0,0,10
- dc.l 0,0
- dc.w 0
- dc.l PLACETEXT_IN,0,0
- topaz8:
- dc.l 0
- dc.w 8
- dc.b 0,1
- ;;
- ** BYTE Daten
- ParaTemplate dc.b 'NOKEY/S',0
- intname INTNAME
- dosname DOSNAME
- gadname GADTOOLSNAME
- inputname dc.b 'input.device',0
- PrefsFileName dc.b 'S:'
- PrefsFile1 dc.b 'BangerMenuDisk.prefs',0
- topazFName8 dc.b 'topaz.font',0
- WindowTitle dc.b 'BangerMenuDisk',0
- dc.b '$VER: '
- ScreenTitle dc.b 'BangerMenuDisk 1.4 (13-Feb-1996) © by Andre´ Trettin',0
- ;;
-